from abc import ABC, abstractmethod
from typing import Any, Dict

class ConfigInterface(ABC):
    """
    配置接口。

    配置表示任务运行的可选参数，由配置加载器加载。
    配置可以是从配置文件、环境变量、配置中心等加载而来。
    """

    @abstractmethod
    def get(self, key: str, default: Any = None) -> Any:
        """
        获取指定键的配置值。

        Args:
            key (str): 配置键。
            default (Any): 默认值，当键不存在时返回。

        Returns:
            Any: 配置值，如果键不存在，则返回默认值。
        """
        pass

    @abstractmethod
    def set(self, key: str, value: Any) -> None:
        """
        设置指定键的配置值。

        Args:
            key (str): 配置键。
            value (Any): 配置值。
        """
        pass

    @abstractmethod
    def has(self, key: str) -> bool:
        """
        检查是否存在指定键的配置。

        Args:
            key (str): 配置键。

        Returns:
            bool: 如果存在指定键的配置，则返回 True，否则返回 False。
        """
        pass

    @abstractmethod
    def remove(self, key: str) -> None:
        """
        移除指定键的配置。

        Args:
            key (str): 配置键。
        """
        pass

    @abstractmethod
    def clear(self) -> None:
        """
        清空所有配置。
        """
        pass

    @abstractmethod
    def to_dict(self) -> Dict[str, Any]:
        """
        将配置转换为字典。

        Returns:
            Dict[str, Any]: 包含所有配置的字典。
        """
        pass

    @abstractmethod
    def from_dict(self, data: Dict[str, Any]) -> None:
        """
        从字典中加载配置。

        Args:
            data (Dict[str, Any]): 包含配置的字典。
        """
        pass

    @abstractmethod
    def load(self) -> None:
        """
        加载配置。

        根据配置加载器的实现，从指定的源（如配置文件、环境变量、配置中心等）加载配置。
        """
        pass

    @abstractmethod
    def save(self) -> None:
        """
        保存配置。

        根据配置加载器的实现，将配置保存到指定的目标（如配置文件、配置中心等）。
        """
        pass

    @abstractmethod
    def reload(self) -> None:
        """
        重新加载配置。

        当配置发生变化时，重新加载配置。这可能会触发相关的任务重新执行。
        """
        pass